<?php
namespace app\common\controller\storage;

use think\Db;
use Exception;
use think\Controller;

/**
 * 文件上传基础控制器
 */
class Upload extends Controller
{
	/**
	 * 初始化方法
	 */
    protected function initialize()
    {
        // 本地存储存储目录
        // 示例: attachment/lingchi_bn
        $this->localPath = $this->localPath();
		// 云存储文件存放目录
        // 格式: 当前域名/模块名/年月日
        // 示例: me.cy/lingchi_bn/20210317
        $this->storagePath = $this->storagePath();
        // 获取当前在使用的云存储
        $this->storageConfig = $this->storageConfig();
        // 获取当前使用云存储类型
        // 0 没有使用云存储 1 七牛云 2 阿里云
        $this->storageType = $this->storageConfig ? $this->storageConfig['type'] : 0;
    }

    /**
     * 文件上传成功统一方法
     * $url = 'https://cdn.itqaq.com/123.png';
     * @example $this->achieve($url);
     * @example $this->achieve($url, '背景图上传成功');
     */
    protected function achieve($url, $msg = '上传成功', $code = 1)
    {
        return json(compact('code', 'msg', 'url'));
    }

    /**
     * 文件上传失败统一方法
     * @example $this->fail('上传失败');
     */
    protected function fail($msg = '上传失败', $code = 0)
    {
        return json(compact('code', 'msg'));
    }

    /**
     * 判断是否有上传文件
     * @param  [type]  $name [description]
     * @return object|string object 有文件上传
     * @example $file = $this->isUpload($name);
     * @example 判断是否有文件上传
     * @example if ( ! $file instanceof \think\File ) return $file;
     */
    protected function isUpload($name)
    {
        try {
			$file = request()->file($name);
			if ( ! $file ) throw new Exception('没有文件上传');
		} catch (Exception $e) {
			return $this->fail($e->getMessage());
		}
		return $file;
    }

    /**
     * 返回文件在存储空间中的存放位置
     * @param $file 新文件名称
     * @example $this->buildSaveName($file);
     */
    protected function buildSaveName($file)
    {
        // 获取文件后缀名
        $ext = $this->getFileExt($file->getInfo('name'));
        // 这里是有sha1加密 生成文件名 之后连接上后缀
        $filename = sha1(date('YmdHis', time()) . uniqid()) . '.' . $ext;
       // 在存储空间中的存放目录
        return $this->storagePath . '/' . $filename;
    }

    /**
     * 获取文件后缀名
     * @param  $filename 文件名 avatar.png
     * @return 后缀名 jpg,png,gif,txt
     */
    protected function getFileExt($filename)
    {
        return substr($filename, strrpos($filename, '.') + 1);
    }

    /**
     * 获取当前在使用的云存储
     */
    private function storageConfig()
    {
        return Db::name('cloud_storage')
        	->where(i())
        	->where('in_use', 1)
        	->findOrEmpty();
    }

    /**
     * 本地存储存储目录
     */
    protected function localPath()
    {
        return ATTACHMENT_ROOT . module();
    }

    /**
     * 云存储文件存放目录
     */
    private function storagePath()
    {
        return implode('/', [request()->host(), module(), date('Ymd')]);
    }
}
